package tag

import (
	"encoding/base64"
	"fmt"
	"github.com/bytedance/sonic"
	"hash/fnv"
	"time"
)

// CreateTagRequest 创建标签的请求结构体
type CreateTagRequest struct {
	TKey   string `json:"t_key" validate:"required"`
	TValue string `json:"t_value"`
	BlogId int    `json:"blog_id" validate:"required"`
}

func (r Tag) String() string {
	b, err := sonic.Marshal(r)
	if err != nil {
		panic(err)
	}
	return string(b)
}
func NewCreateTagRequest() *CreateTagRequest {
	return &CreateTagRequest{}
}

// Tag 标签数据库表中对应的模型
type Tag struct {
	*CreateTagRequest
	Id        string `json:"id"`
	CreatedAt int64  `json:"created_at"`
}

func NewTag(request *CreateTagRequest) (*Tag, error) {
	//更换成更短的
	//h := sha256.New()
	//创建短hash器
	h := fnv.New32()
	//写入数据
	_, err := h.Write([]byte(fmt.Sprintf("%d_%s_%s", request.BlogId, request.TKey, request.TValue)))
	if err != nil {
		return nil, err
	}
	res := h.Sum(nil)
	return &Tag{
		//hex 不算短，可以使用base64
		//Id:               hex.EncodeToString(res),
		Id:               base64.StdEncoding.EncodeToString(res),
		CreatedAt:        time.Now().Unix(),
		CreateTagRequest: request,
	}, nil
}

// UpdateTagRequest 更新标签的请求结构体
type UpdateTagRequest struct {
	*CreateTagRequest
	Id string `json:"id" validate:"required"`
}

func NewUpdateTagRequest() *UpdateTagRequest {
	return &UpdateTagRequest{}
}

// DeleteOrGetTagRequest 删除和查询标签的结构体 都可以通过key或者博客id来操作
type DeleteOrGetTagRequest struct {
	Id      string `json:"id"`
	BlogIds *[]int `json:"blog_id" `
}

func NewDeleteOrGetTagRequest() *DeleteOrGetTagRequest {
	return &DeleteOrGetTagRequest{}
}

// TagsList 查询和删除标签都会存在多个标签操作的情况，所以需要用切片接收然后返回
type TagsList struct {
	Total int64  `json:"total"`
	Items []*Tag `json:"items"`
}

func NewTagsList() *TagsList {
	return &TagsList{
		//初始化切片，防止出现空指针
		Items: []*Tag{},
	}
}
